بهالمقالة بتكلم عن طريقة مبسطة للتعامل مع المواقع والمساحات الجغرافية، وكيف نحدد الموقع المستخدم ونقارنه بمناطق معيّنة، باستخدام CoreLocation في iOS و PostGIS في الباكيند.
لو عندنا ميزة نخلي المستخدم يختار حي ونشيك اذا هو فيه حاليا، قد فكرتوا كيف نخزن مساحة الحي وكيف ممكن نبحث في حي او مساحه؟
عشان نسوي هالشي، أول خطوة في iOS إن اليوزر يعطي سماح للتطبيق باستخدام الموقع، وبعدها نستخدم CoreLocation عشان نجيب الإحداثيات. الإحداثيات تجينا على شكل CLLocation فيها latitude و longitude.
هذي قيست على طريقه استخدام CoreLocation
في الخرائط، كل نقطة لها إحداثيات تشبه نظام X و Y اللي كلنا متعودين عليه، وحتى الخرائط لها نقطة الصفر، يسمونها Null Island (0,0)، وهي ببساطة نقطة تقاطع خط العرض مع خط الطول .

بعد ما ناخذ نقطة موقع المستخدم من iOS، نبي نعرف هل هو موجود داخل حي معيّن. هل معقول نحفظ كل نقطة ممكنة داخل الحي؟ لا الأسهل إننا نمثل الحي نفسه كمساحة، نحدد حدوده بالنقاط ونقفلها مع بعض، وفيه مكتبات مفتوحة المصدر تساعد في هالشي وتسهّل البحث داخل المساحات.
هنا يجي دور PostGIS، وهو امتداد لـ PostgreSQL يدعم البيانات الجغرافية (يبحث داخل المساحات، يحسب المسافات، يخزن نقطه او مساحه). نقدر نخزن حدود الحي كـ Polygon، وبعدين نتحقق هل نقطة المستخدم داخل هالمساحة أو لا.
مثلا نقدر نخزن نقطه ومساحه بهذا الشكل:
( ملاحظة مهمه هنا الإحداثيات بالترتيب (longitude, latitude) عكس اللي متعودين عليه بالعاده )
insert into cities (center, city_id, name_ar, name_en, region_id)
values
(ST_GeomFromText('POINT(36.53387003 28.41463997)'), 1, 'تبوك', 'Tabuk', 7),
(ST_GeomFromText('POINT(46.73333003 24.69999996)'), 3, 'الرياض', 'Riyadh', 1)
insert into districts (boundaries, city_id, district_id, name_ar, name_en, region_id)
values
(ST_GEOMFROMTEXT('POLYGON(
(46.6356207 24.75608823,46.62933123 24.75343623,46.62644075 24.7591407,46.61271469 24.78622418,46.62249445 24.79034257,46.63067404 24.79378338,46.63067585 24.79377981,46.63253905 24.79010403,46.63434672 24.78651497,46.63703871 24.78118646,46.64079904 24.77372044,46.64266427 24.77007116,46.64464034 24.76614957,46.64691617 24.76165669,46.64724988 24.76100047,46.64706037 24.76092033,46.64159633 24.75860951,46.63815356 24.75715629,46.6356207 24.75608823)
)'), 3, 10100003107, 'حي العقيق', 'Al Aqeeq Dist.', 1),والبحث ب sql بيكون بهذا الشكل:
SELECT COUNT(*)
FROM districts d
WHERE d.district_id = '3'
AND ST_Contains(
d.boundaries,
ST_SetSRID(ST_Point(46.73333003, 24.69999996), 4326)
);رفعت كود بسيط على طريقه التخزين والبحث تقدرون تتطلعون عليه هنا
طيب الداتا من وين؟ ممكن نجيبها من مصادر مفتوحة، مثل هذا المشروع اللي يحتوي على مناطق وأحياء السعودية: https://github.com/homaily/Saudi-Arabia-Regions-Cities-and-Districts
وبس 🥳! شكرًا لوقتك، وإن شاء الله المقالة كانت خفيفة ومفيدة
وشكرا للأسطوره غيداء على شرحها الموضوع لي 🩷